Redshift新機能 『Redshift Spectrum』でクラスタ間テーブル共有を試してみる
はじめに
サンフランシスコの2017/04/19(日本では2017/04/20深夜)より『AWS Summit 2017 in San Francisco』が開催されています。
こちらのキーノートセッションで、Amazon Redshift(以下Redshift)の新機能『Redshift Spectrum』が発表されました。Amazon S3(以下S3)上のデータに対し、Redshiftのテーブルと同じように問合せできるようになる、という機能です。
この新機能については、既に公式ドキュメントが公開されています。
- Amazon Redshift Spectrum – Exabyte-Scale In-Place Queries of S3 Data | AWS Blog
- Amazon Redshift Spectrum Limitations - Amazon Redshift
また、本機能に関するブログも弊社より早速公開していますので、公式ドキュメントと併せて御覧ください。
- 【速報】Amazon Redshift:S3のデータを直接検索出来る新機能『Redshift Spectrum』が発表されました! #awssummit | Developers.IO
- 【Amazon Redshift:Redshift Spectrumの概要/仕様/制限事項など #awssummit | Developers.IO
さて、この新機能、S3上のファイルをテーブルとして参照できるということは、S3上のファイルであれば、クラスタ間でテーブル共有が実現できるかも知れません。わくわくです。早速実現可能かどうか試してみます。
検証
複数クラスタから同じS3上のファイルをテーブルとして参照できるよう環境を構成します。 環境構築には、以下のツールを使用しています。
- Aginity Workbench for Redshift
- CloudBerry Explorer for Amazon S3
Redshiftクラスタの準備
2017/04/20時点においては、Redshift Spectrumは東京リージョンで使うことができません。そこで今回は、バージニア北部(N. Virginia)リージョンでクラスタを構成することにします。
注:以降、本エントリにおける「現在」とは、2017年4月20日を指すこととします。
基本的な環境の作り方は、下記公式ドキュメント及び弊社ブログに記載があります。
- Getting Started with Amazon Redshift Spectrum - Amazon Redshift Database Developer Guide
- 【S3データを直接クエリ出来る新機能『Amazon Redshift Spectrum』を実際に試してみました | Developers.IO
こちらの内容を参考にして、以下の設定でクラスタを作成します。
- クラスタ名:cm-redshift-spectrum
- データベース名:cmdb
- ゾーン:us-east-1a
また、S3バケットのファイルをAthena経由でアクセスできるロールを作成し、クラスタに追加します。
- ロール名:Redshift-Spectrum-Role
- ロールタイプ:Amazon Redshift
- 適用ポリシー:AmazonS3ReadOnlyAccess, AmazonAthenaFullAccess
データファイルの準備
S3バケット、フォルダの作成
現在のRedshift Spectrumの制限として、Amazon RedshiftクラスタとAmazon S3バケットは同じ地域に存在している必要があります。それに従い、US East(Northern Virginia)にバケットを作成します。
- バケット名:cm-yokatsuki-bigdata-lab
- フォルダ名:spectrum-test
ファイルの作成、配置
csv形式のファイルsample.csvを作成し、上記フォルダに配置します。
% cat sample.csv 1,1件目のデータ 2,2件目のデータ 3,3件目のデータ
テーブル参照の設定と確認
次に、上記チュートリアルを参考に、Redshiftクラスタ上にテーブルを作成します。
外部スキーマの作成
Redshift Spectrum用のスキーマspectrum_schemaを作成します。
CREATE EXTERNAL SCHEMA spectrum_schema FROM DATA CATALOG DATABASE 'spectrumdb' IAM_ROLE 'arn:aws:iam::XXXXXXXXXXXX:role/Redshift-Spectrum-Role' CREATE EXTERNAL DATABASE IF NOT EXISTS;
このSQL文中にデータベースの指定がありますが、これはRedshiftのデータベース名ではなくAthenaのデータベース名になります。新規にデータベースを追加したつもりでも、Redshiftにはデータベースが追加されないので注意して下さい。
外部テーブルの作成
spectrum_schemaに外部テーブルsampleを作成します。
CREATE EXTERNAL TABLE spectrum_schema.sample ( id INTEGER, data VARCHAR(20) ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION 's3://cm-yokatsuki-bigdata-lab/spectrum-test/';
データが参照できることを確認しておきます。
クラスタ複製、接続確認
外部テーブルを共有する、別のRedshiftクラスタを準備します。新規に作成しても良いのですが、今回は作業を楽にするためにクラスタのスナップショットを作成し、そこから新しいクラスタcm-redshift-spectrum2を作成する形にします。
スナップショットから作成したクラスタにはロールの設定が引き継がれないので、クラスタcm-redshift-spectrum2に改めてロールRedshift-Spectrum-Roleを付与しておいて下さい。
複数クラスタからのデータ参照
ここまでで、それぞれのクラスタからS3上の同じデータが参照できる状態になっています。
S3ファイルを更新し、それぞれのクラスタから更新されたデータを参照できることを確認します。
確認したところ、S3のファイル更新が完了した時点で特にタイムラグもなく、全てのクラスタからの問合せの結果も新しいファイルの内容に変わりました。
まとめ
Amazon Redshiftの新機能Redshift Spectrumを使って、クラスタ間でテーブルが共有できることを確認しました。
Redshiftクラスタを超えたテーブル連携が実現したのは、今後のRedshiftの使い方を大きく広げる可能性を秘めているように思います。今後もRedshift Spectrumの検証を続けたいと思うので是非続報をお楽しみに。それでは、また。